package com.bflow.api;

import com.bflow.api.bo.*;
import com.bflow.api.constant.BflowConstant.ActAssignTypes;
import com.bflow.commons.bean.PageBean;
import com.bflow.commons.bean.PageResult;
import com.bflow.commons.exception.BizException;
import com.bflow.commons.po.BasePo;
import com.bflow.commons.service.IBaseService;

import java.io.Serializable;
import java.util.List;

/**
 * 功能：BflowRunTask 任务-业务接口
 * 作者：haowen
 * 日期：2018-12-13
 */
public interface IBflowRunTaskService<P extends BasePo, B extends Serializable> extends IBaseService<P, B> {

    /**
     * 添加任务
     * @param bflowRunTaskBo
     */
    void add(BflowRunTaskBo bflowRunTaskBo) throws BizException;

    void addNextTask(String nextActId, String assignee, String instanceId, String procId, BflowRunTaskAuditBo auditBo) throws BizException;

    /**
     * 取消任务
     * @param instanceId
     * @throws BizException
     */
    void cancelTask(String instanceId) throws BizException;

    /**
     * 分派任务
     * @param auditBo
     * @param receiveByKey
     */
    void assign(BflowRunTaskAuditBo auditBo, ActAssignTypes assignType, String receiveByKey);

    /**
     * 处理任务
     * @param auditBo
     */
    void process(BflowRunTaskAuditBo auditBo);

    /**
     * 获取 任务信息
     * @param taskId
     * @param userId
     * @param getRecords 获取记录
     * @param getActRoutes 获取路由
     * @return
     */
    BflowRunTaskBo getTaskInfo(String taskId, String userId, boolean getRecords, boolean getActRoutes);

    /**
     * 获取 待处理任务列表
     * @param userId 用户ID   内部处理含角色的任务
     * @param procKey instance流程key
     * @param actId 活动id（可不传）
     * @return
     */
    BflowWaitDisposeBo getWaitDisposeTaskList(String userId, String procKey, String actId,String userKey);

    /**
     * 获取 待处理任务列表记录条数
     * @param userId 用户ID   内部处理含角色的任务
     * @param procKey instance流程key
     * @param actId 活动id（可不传）
     * @return
     */
    long countWaitDisposeTask(String userId, String procKey, String actId);

    /**
     * 获取 下个活动 处理人
     * @param actSort
     * @param paramAssignee 外部传入处理人
     * @param defineActBo
     * @param processBo
     * @return
     */
    String getNextActAssignee(Integer actSort, String paramAssignee, BflowDefineActBo defineActBo, BflowDefineProcessBo processBo);

    /**
     * 任务列表
     * @param pageBean
     * @param busiKey
     * @param actKey
     * @param userKey
     * @return
     * @throws BizException
     */
    PageResult<BflowRunTaskBo> findMyTaskPage(PageBean pageBean, String busiKey, String actKey, String userKey) throws BizException;

    /**
     * 查询任务列表以及关联业务数据
     * @param queryParam 查询条件
     * @return
     */
    PageResult<BflowRunTaskBo> findTaskInstancePage(BflowRunTaskQueryParam queryParam) throws BizException;

    /**
     * 查询任务列表以及关联业务数据记录数
     * @param queryParam 查询条件
     * @return
     */
    long findTaskInstancePageCount(BflowRunTaskQueryParam queryParam);

    /**
     * 获取待办任务数
     * @param userKey 代办者标识,无则查询全部代办者的待办数
     * @param busiKey 流程业务KEY,无则查询全部流程的待办数
     * @return
     */
    Long getWaitTaskCount(String userKey, String busiKey);

    /**
     * 获取 代办任务列表
     * @param instanceId
     * @return
     * @throws BizException
     */
    List<BflowRunTaskBo> findWaitTaskList(String instanceId) throws BizException;

    /**
     * 转交用户
     * @param auditBo
     * @param transferUserId
     * @param userId
     */
    void transfer(BflowRunTaskAuditBo auditBo, ActAssignTypes transferUserId, String userId);
}
